#include "LRUCache.h"
#include <string.h>
#include <stdlib.h>

LRUCache::LRUCache(int capacity)
    :_capacity(capacity)
     ,_mutex()
{}

string LRUCache::get(string key) {
    //上锁,函数结束自动解锁
    unique_lock<mutex> autoMutex(_mutex); 
    //查找节点
    auto it = _cache.find(key);
    if(it != _cache.end()){
        //节点存在
        //将此节点放在首节点
        _nodes.splice(_nodes.begin(),_nodes,it->second);
        return it->second->second;
    }else{
        //没有该节点
        return string();
    }
}

void LRUCache::put(const string& key,const string& value) {
    //上锁,函数结束自动解锁
    unique_lock<mutex> autoMutex(_mutex); 

    auto it = _cache.find(key);
    if(it != _cache.end()){
        //节点存在
        //修改vlaue的值，并将此节点放在首节点
        it->second->second = value;
        _nodes.splice(_nodes.begin(),_nodes,it->second);
    }else{
        if((int)_cache.size() >= _capacity){
            //没有容量了,删除最后一个节点
            auto& back_node = _nodes.back();
            //从容器中移除
            auto it = _cache.find(back_node.first);
            _cache.erase(it);
            _nodes.pop_back();
        }      
        //添加新的节点
        pair<string,string> node(key,value);
        _nodes.push_front(node);
        auto it = _nodes.begin();
        _cache[key] = it;

    }
}
